package com.li.o2oSystem.util;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.jhlabs.image.ImageUtils;
import com.li.o2oSystem.dto.ImageHolder;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

public class ImageUtil {
	//通过当前线程逆推类加载器，获取项目绝对路径
	private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
	//定义设置根据年月日时分秒生成的格式
	private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
	//定义随机数对象
	private static final Random r = new Random();
	//定义日志对象
	private static Logger logger = LoggerFactory.getLogger(ImageUtils.class);
	
	/**
	 * 将CommonsMultipartFile 转换成File类
	 * @param cFile
	 * @return
	 */
	public static File transferCommonsMultipartFileToFile(CommonsMultipartFile cFile){
		File newFile = new File(cFile.getOriginalFilename());
		try {
			cFile.transferTo(newFile);
		} catch (IllegalStateException e) {
			logger.error(e.getMessage());//记录错误日志
			e.printStackTrace();
		} catch (IOException e) {
			logger.error(e.getMessage());//记录错误日志信息
			e.printStackTrace();
		}
		return newFile;
	}
	/**
	 * 处理缩略图，并返回新生成图片的相对路径
	 * @param thumbnails
	 * @param targetAddr
	 * @return
	 */
	//传入文件流，和返回的目标路径
	public static String generateThumbnails(ImageHolder thumbnail,String targetAddr){
		String realFileName = getRandomFileName();//获取文件随机名
		String extension = getFileExtension(thumbnail.getImageName());//获取文件的扩展名
		makeDirPath(targetAddr);//创建目标路径
		String relativeAddr = targetAddr+realFileName+extension;//处理后的图片的相对路径
		logger.debug("current relativeAddr is :"+relativeAddr);//日志记录当前图片的相对路径
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);//获取文件的全路径
		logger.debug("current complete addr is:"+PathUtil.getImgBasePath() + relativeAddr);//记录当前的图片的全路径
		try{
		//处理文件
		Thumbnails.of(thumbnail.getImage()).size(200, 200)//处理图片后的大小
		//.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "watermark.jpg")), 0.25f)//添加水印，1水印位置，2读取水印图片，3水印透明度
		.outputQuality(0.8f)//压缩率
		.toFile(dest);//输出路径
		}catch(IOException e){
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		return relativeAddr;
	}
	/**
	 * 生成随机文件名称， 当前年月日时分秒+5位随机数
	 * @return
	 */
	public static String getRandomFileName() {
		int rannum = r.nextInt(89999)+10000;//获取随机五位数
		String nowTimeStr = sDateFormat.format(new Date());//获取当前时间，设置字符串格式
		return nowTimeStr+rannum;//字符串+整型，结果自动转换为字符串
	}
	/**
	 * 获取输入文件流的扩展名
	 * @param thumbnails
	 * @return
	 */
	private static String getFileExtension(String fileName) {
		return fileName.substring(fileName.lastIndexOf("."));//截取最后一个.的后面的字符串
	}
	/**
	 * 创建目标路径所涉及的目录
	 * @param targetAddr
	 */
	private static void makeDirPath(String targetAddr) {
		String realFileParentPath = PathUtil.getImgBasePath()+targetAddr;//获取文件的全路径（目录）
		File dirPath = new File(realFileParentPath);
		if(!dirPath.exists()){//如果路径不存在，则创建
			dirPath.mkdirs();//递归创建文件夹
		}
	}
	/**
	 * main函数，测试图片处理
	 * @param args
	 * @throws IOException
	 */
	public static void main(String [] args) throws IOException{
		Thumbnails.of(new File("E:/testImg/2015022406.jpg"))
		.size(200, 200)//处理图片大小
		//添加水印：位置，水印图片位置，透明度（部分图片添加水印会出问题）
		.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath+"/watermark.jpg")), 0.25f)
		.outputQuality(0.8f)//图片的压缩率，百分之八十
		.toFile("E:/testImg/123456.jpg");//处理后的文件输出位置
	}
	/**
	 * 删除旧的图片
	 * 判断store是文件的路径还是目录的路径
	 * 如果storePath是文件的路径则删除该文件，
	 * 如果storePath是目录的路径，则删除该目录下的所有文件
	 * @param storePath
	 */
	public static void deleteFileOrPath(String storePath){
		File fileOrPath = new File(PathUtil.getImgBasePath()+storePath);
		if(fileOrPath.exists()){
			if(fileOrPath.isDirectory()){//如果是目录，则删除该目录下的所有文件
				File file[] = fileOrPath.listFiles();
				for(int i = 0;i<file.length;i++){
					file[i].delete();
				}
			}
			fileOrPath.delete();
		}
	}
	/**
	 * 
	 * @param productImgHolder
	 * @param dest
	 * @return
	 */
	public static String generateNormalImg(ImageHolder thumbnail, String targetAddr) {
		//获取随机名
		String realFileName = getRandomFileName();
		//获取文件的扩展名
		String extension = getFileExtension(thumbnail.getImageName());
		//如果目标路径不存在，则创建
		makeDirPath(targetAddr);
		//获取文件存储的相对路径
		String relativeAddr = targetAddr+realFileName+extension;
		logger.debug("current relativeAddr is:"+relativeAddr);
		//获取文件要保存到的路径
		File dest = new File(PathUtil.getImgBasePath()+relativeAddr);
		logger.debug("current complete addr is:"+PathUtil.getImgBasePath()+relativeAddr);
		//调用Thunbnails生成带有水印的图片
		try {
			Thumbnails.of(thumbnail.getImage()).size(337, 640)
				//.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath+"/watermark.jpg")), 0.25f)
				.outputQuality(0.9f)
				.toFile(dest);
		} catch (IOException e) {
			logger.error(e.getMessage());
			throw new RuntimeException("创建缩略图异常："+e.getMessage());
		}
		//返回图片相对路径地址
		return relativeAddr;
	}
}
